package com.yhd.service;

import com.yhd.entity.dto.*;
import com.yhd.entity.query.*;
import com.yhd.entity.result.ResultVo;
import com.yhd.entity.wx.WxPayResult;
import com.yhd.model.ResultPage;

import java.util.List;

public interface CourseService {

    /**
     * 创建课程/活动/师资
     * @param courseVO
     * @param userDto
     * @return
     */
    CourseDto addCourse(CourseVO courseVO, UserDto userDto);

    /**
     * 查看课程列表
     * @param type
     * @param pageNum
     * @param pageSize
     * @return
     */
    ResultPage<List<CourseDto>> getCourseList(String type, Integer pageNum, Integer pageSize);

    /**
     * 查看课程详情
     * @param courseVO
     * @param userInfo
     * @return
     */
    CourseDto courseDetail(Integer courseVO, UserDto userInfo);

    /**
     * 获取课程列表
     * @param courseVO
     * @return
     */
    ResultPage<List<CourseDto>> selectCourseList(CourseVO courseVO);

    /**
     * 获取课程/活动详情
     * @param courseVO
     * @return
     */
    CourseDto selectCourseInfo(CourseVO courseVO);
    
    ResultPage<List<CourseDto>> getActivityList(String name, Integer activityStatus, String classifyId, Integer pageSize, Integer pageNum, String startTime, String endTime);

    /**
     *  师资列表
     * @param name
     * @param classifyId
     * @param pageSize
     * @param pageNum
     * @return
     */
    ResultPage<List<CourseDto>> getTeamList(String name, String classifyId, Integer pageSize, Integer pageNum);


    ResultVo<CourseBookedDto> order(CourseBookedVO booked, UserDto userInfo);

    /**
     * 获取全部课程
     * @param courseVO
     * @return
     */
    List<CourseDto> selectAllCourseList(CourseVO courseVO);

    /**
     * 活动分类列表
     * @return
     */
    List<SystemDictionaryDto> getActivityListClassList();

    /**
     * 师资分类列表
     * @return
     */
    List<SystemDictionaryDto> getTeamListClassList();
	
	ResultVo<WxPayResult> wxPay(String orderNo, UserDto userInfo) throws Exception;

    CourseDto collect(CourseVO courseVO, UserDto userInfo);

    ResultVo<CourseAboutDto>  about(CourseAboutVO aboutVO, UserDto userInfo);

    ResultPage<List<CourseAboutDto>> userAboutList(UserDto userInfo, Integer status, Integer pageSize, Integer pageNum);
    
    List<CourseDto> userCollectedList(String type, String userId);

    ResultPage<List<CourseBookedDto>> userOrderList(String type, Integer status, String userId, Integer pageSize, Integer pageNum);

    /**
     * 小程序查询排课列表v1
     * @param courseScheduleDetailVO
     * @param userInfo
     * @return
     */
	List<CourseScheduleDetailDto> courseSchedule(CourseScheduleDetailVO courseScheduleDetailVO, UserDto userInfo);


    /**
     * TODO: 多对多关系使用，待完善
     * 小程序查询排课列表v2
     * @param courseScheduleDetailVO
     * @param userInfo
     * @return
     */
    List<CourseScheduleDetailDto> courseScheduleList(CourseScheduleDetailVO courseScheduleDetailVO, UserDto userInfo);


    /**
     * 活动详情
     * @param courseId
     * @param userInfo
     * @return
     */
    CourseDto activityDetail(Integer courseId, UserDto userInfo);

    /**
     * 师资详情
     * @param teamId
     * @param userInfo
     * @return
     */
    CourseDto teamDetail(Integer teamId, UserDto userInfo);


    /**
     * 订单详情
     * @param orderId
     * @param userInfo
     * @return
     */
    CourseBookedDto orderDetail(Integer orderId, UserDto userInfo);
    
    List<CourseDto> userRights(UserDto userInfo);

    /**
     * 修改课程、活动
     * @param courseVO
     * @param userInfo
     * @return
     */
    CourseDto updateCourse(CourseVO courseVO, UserDto userInfo);

    /**
     * 课程、活动批量上下架
     * @param courseVOList
     * @param status
     * @param userInfo
     * @return
     */
    boolean updateCourseStatus(List<CourseVO> courseVOList, int status, UserDto userInfo);

    /**
     * 删除课程
     * @param courseVO
     * @param userInfo
     * @return
     */
    Boolean deleteCourse(CourseVO courseVO, UserDto userInfo);

    
    List<UserCountDto> selectCountByUsers(List<String> userIds);
	
	List<UserCountDto> countUserAbout(List<String> userIds);

    /**
     * 查询课程排课时间列表
     * @param courseScheduleDetailVO
     * @return
     */
    List<CourseScheduleDetailDto> selectCourseScheduleList(CourseScheduleDetailVO courseScheduleDetailVO);

    /**
     * 新增、修改课程排课
     * @param courseScheduleDetailVO
     * @param userInfo
     * @return
     */
    ResultVo<CourseScheduleDetailDto> putCourseSchedule(CourseScheduleDetailVO courseScheduleDetailVO, UserDto userInfo);

    /**
     * 删除课程排课
     * @param courseScheduleDetailVO
     * @return
     */
    ResultVo<Boolean> deleteCourseSchedule(CourseScheduleDetailVO courseScheduleDetailVO);

    CourseBookedDto orderAudit(CourseBookedVO bookedVO, UserDto userInfo);

    /**
     * 获取课程浏览用户
     * @param browseRecordVO
     * @return
     */
    ResultPage<List<BrowseRecordDto>> selectCourseBrowseList(BrowseRecordVO browseRecordVO);


    ResultVo cancelAbout(CourseAboutVO aboutVO, UserDto userInfo);
}
